// #include "SH1106.h"
// #include <string.h>
// #include "OledFont.h"
// #include "SH1106.h"



// // 显示缓存
// uint8_t SH1106_Buffer[SH1106_PAGE_NUM][SH1106_WIDTH];

// // 软件I2C延时函数
// static void I2C_Delay(void)
// {
//     uint8_t i = 5;
//     while (i--)
//         ;
// }

// // 设置SDA引脚状态
// static void SET_SDA(uint8_t state)
// {
//     if (state)
//     { 
//         GPIO_SetBits(OLED_SDA_PORT, OLED_SDA_PIN);
//     }
//     else
//     {
//         GPIO_ResetBits(OLED_SDA_PORT, OLED_SDA_PIN);
//     }
// }

// // 设置SCL引脚状态
// static void SET_SCL(uint8_t state)
// {
//     if (state)
//     {
//         GPIO_SetBits(OLED_SCL_PORT, OLED_SCL_PIN);
//     }
//     else
//     {
//         GPIO_ResetBits(OLED_SCL_PORT, OLED_SCL_PIN);
//     }
// }

// // I2C起始信号
// static void I2C_Start(void)
// {
//     SET_SDA(1);
//     SET_SCL(1);
//     I2C_Delay();
//     SET_SDA(0);
//     I2C_Delay();
//     SET_SCL(0);
//     I2C_Delay();
// }

// // I2C停止信号
// static void I2C_Stop(void)
// {
//     SET_SDA(0);
//     SET_SCL(1);
//     I2C_Delay();
//     SET_SDA(1);
//     I2C_Delay();
// }

// // 等待应答
// static uint8_t I2C_Wait_Ack(void)
// {
//     uint8_t ack;
//     SET_SDA(1);
//     SET_SCL(1);
//     I2C_Delay();
//     ack = GPIO_ReadInputDataBit(OLED_SDA_PORT, OLED_SDA_PIN);
//     SET_SCL(0);
//     I2C_Delay();
//     return ack;
// }

// // 发送一个字节
// static void I2C_SendByte(uint8_t data)
// {
//     uint8_t i;
//     for (i = 0; i < 8; i++)
//     {
//         SET_SCL(0);
//         I2C_Delay();
//         if (data & 0x80)
//         {
//             SET_SDA(1);
//         }
//         else
//         {
//             SET_SDA(0);
//         }
//         data <<= 1;
//         I2C_Delay();
//         SET_SCL(1);
//         I2C_Delay();
//     }
//     SET_SCL(0);
//     I2C_Delay();
// }

// // 发送命令
// static void SH1106_Write_Cmd(uint8_t cmd)
// {
//     I2C_Start();
//     I2C_SendByte(SH1106_I2C_ADDR);
//     I2C_Wait_Ack();
//     I2C_SendByte(0x00); // 命令模式
//     I2C_Wait_Ack();
//     I2C_SendByte(cmd);
//     I2C_Wait_Ack();
//     I2C_Stop();
// }

// // 发送数据
// static void SH1106_Write_Data(uint8_t *data, uint16_t len)
// {
//     uint16_t i;
//     I2C_Start();
//     I2C_SendByte(SH1106_I2C_ADDR);
//     I2C_Wait_Ack();
//     I2C_SendByte(0x40); // 数据模式
//     I2C_Wait_Ack();
//     for (i = 0; i < len; i++)
//     {
//         I2C_SendByte(data[i]);
//         I2C_Wait_Ack();
//     }
//     I2C_Stop();
// }

// // SH1106初始化
// void SH1106_Init(void)
// {
//     GPIO_InitTypeDef GPIO_InitStructure;

//     // 使能GPIOA时钟
//     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

//     // 配置SCL和SDA引脚
//     GPIO_InitStructure.GPIO_Pin = OLED_SCL_PIN | OLED_SDA_PIN;
//     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
//     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//     GPIO_Init(GPIOA, &GPIO_InitStructure);

//     // 初始化引脚状态
//     SET_SCL(0);
//     SET_SDA(0);

//     // 延时等待OLED上电稳定
//     for (volatile int i = 0; i < 10000; i++)
//         ;

//     // SH1106初始化序列
//     SH1106_Write_Cmd(0xAE); // 关闭显示

//     SH1106_Write_Cmd(0x02); // 设置列地址低位
//     SH1106_Write_Cmd(0x10); // 设置列地址高位

//     SH1106_Write_Cmd(0x40); // 设置显示起始行

//     SH1106_Write_Cmd(0x81); // 设置对比度
//     SH1106_Write_Cmd(0x80); // 对比度值

//     SH1106_Write_Cmd(0xA1); // 段重映射设置
//     SH1106_Write_Cmd(0xC8); // 扫描方向设置

//     SH1106_Write_Cmd(0xA6); // 正常显示
//     SH1106_Write_Cmd(0xA8); // 设置多路复用比率
//     SH1106_Write_Cmd(0x3F); // 64MUX

//     SH1106_Write_Cmd(0xD3); // 设置显示偏移
//     SH1106_Write_Cmd(0x00); // 无偏移

//     SH1106_Write_Cmd(0xD5); // 设置显示时钟分频
//     SH1106_Write_Cmd(0x80); // 默认值

//     SH1106_Write_Cmd(0xD9); // 设置预充电周期
//     SH1106_Write_Cmd(0x22); // 默认值

//     SH1106_Write_Cmd(0xDA); // 设置COM引脚硬件配置
//     SH1106_Write_Cmd(0x12); // 64行模式

//     SH1106_Write_Cmd(0xDB); // 设置VCOMH电压倍率
//     SH1106_Write_Cmd(0x20); // 默认值

//     SH1106_Write_Cmd(0x8D); // 设置电荷泵
//     SH1106_Write_Cmd(0x14); // 使能电荷泵

//     SH1106_Write_Cmd(0xAF); // 开启显示

//     // 清屏
//     SH1106_ClearBuffer();
//     SH1106_UpdateScreen();
// }

// // 清空显示缓存
// void SH1106_ClearBuffer(void)
// {
//     memset(SH1106_Buffer, 0, sizeof(SH1106_Buffer));
// }

// // 更新屏幕显示
// void SH1106_UpdateScreen(void)
// {
//     uint8_t page;
//     for (page = 0; page < SH1106_PAGE_NUM; page++)
//     {
//         SH1106_Write_Cmd(0xB0 + page); // 设置页地址
//         SH1106_Write_Cmd(0x02);        // 设置列地址低位(从2开始补偿偏移)
//         SH1106_Write_Cmd(0x10);        // 设置列地址高位

//         SH1106_Write_Data(SH1106_Buffer[page], SH1106_WIDTH);
//     }
// }

// // 画点函数
// void SH1106_DrawPoint(uint8_t x, uint8_t y, uint8_t mode)
// {
//     uint8_t page, line;
//     if (x >= SH1106_WIDTH || y >= SH1106_HEIGHT)
//         return;

//     page = y / 8;
//     line = y % 8;

//     if (mode)
//     {
//         SH1106_Buffer[page][x] |= (1 << line);
//     }
//     else
//     {
//         SH1106_Buffer[page][x] &= ~(1 << line);
//     }
// }

// // 显示一个字符
// void SH1106_ShowChar(uint8_t x, uint8_t y, char chr)
// {
//     uint8_t i;
//     if (chr < ' ' || chr > '~')
//         return; // 只显示可打印字符
//     chr -= ' '; // 减去空格后的索引

//     for (i = 0; i < 6; i++)
//     {
//         SH1106_Buffer[y][x + i] = Font16x811[chr][i];
//     }
// }

// // 显示字符串
// void SH1106_ShowString(uint8_t x, uint8_t y, char *str)
// {
//     while (*str)
//     {
//         SH1106_ShowChar(x, y, *str++);
//         x += 6;
//         if (x > SH1106_WIDTH - 6)
//         {
//             x = 0;
//             y++;
//             if (y >= SH1106_PAGE_NUM)
//                 y = 0;
//         }
//     }
// }